# conda install -c conda-forge osmnx
# https://osmnx.readthedocs.io/en/stable/
# https://qiita.com/moshi/items/e383491664d028cd2166
#
# https://zenn.dev/homing/articles/f9a314841c737d
# https://qiita.com/naozo-se/items/bc168a2282907a6b29bf
# https://stackoverflow.com/questions/62285134/how-to-fill-water-bodies-with-osmnx-in-python
import osmnx as ox
import networkx as nx
import folium
from geopy.distance import distance
# 与えられた緯度経度
latitude = 34.69155489576708 # 例としてケーニッヒスベルクの緯度
longitude = 135.48959938567188 # 例としてケーニッヒスベルクの経度
# 2kmの範囲を定義
distance_km = 2
# 地図データを取得
G = ox.graph_from_point((latitude, longitude),
dist=distance_km*1000)
#network_type='drive')
# グラフを取得
nodes, edges = ox.graph_to_gdfs(G)
# 橋の情報を抽出('bridge'タグを持つエッジのみを抽出)
#bridge_edges = edges[edges['bridge'] == 'yes']
bridge_edges = edges
# グラフのノードとエッジを抽出
bridge_graph = nx.Graph()
# エッジ(橋)をグラフに追加
for idx, data in bridge_edges.iterrows():
u, v, key = idx
bridge_graph.add_edge(u, v)
# オイラー閉路の判定
eulerian = nx.is_eulerian(bridge_graph)
# Foliumで可視化
m = folium.Map(location=[latitude, longitude], zoom_start=14)
# グラフのエッジ(橋)を地図に追加
for u, v in bridge_graph.edges():
point_u = (G.nodes[u]['y'], G.nodes[u]['x'])
point_v = (G.nodes[v]['y'], G.nodes[v]['x'])
folium.PolyLine(locations=[point_u, point_v], color='blue').add_to(m)
# 中心地点にマーカーを追加
folium.Marker(location=[latitude, longitude], popup="中心地点").add_to(m)
# オイラー閉路の有無を表示
if eulerian:
folium.Marker(location=[latitude, longitude], popup="オイラー閉路が存在します。", icon=folium.Icon(color='green')).add_to(m)
else:
folium.Marker(location=[latitude, longitude], popup="オイラー閉路は存在しません。", icon=folium.Icon(color='red')).add_to(m)
m
Make this Notebook Trusted to load map: File -> Trust Notebook